/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.sistemasInf.controller;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.ArrayList;
import pe.edu.pucp.sistemasInf.bean.Cliente;
import pe.edu.pucp.sistemasInf.bean.Factura;
/**
 *
 * @author alulab11
 */
public class MySQLDAOFactura implements DAOFactura {   

    @Override
    public void add(Factura f, int cPadre,int cHijo) {
        //Pasos para la conexión a la BD
        Connection conn = null;
        PreparedStatement pstmt = null;
        //int result  = 0;
        try {
            //Paso 1: Registramos el driver
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //Paso 2: Obtenemos la conexión            
            conn = new DBConfig().getConnection();
            //Paso 3: Preparamos la sentencia
            pstmt = conn.prepareStatement(
                    "INSERT INTO factura(numero_factura, monto_total, monto_intereses,"
                    + "saldo,fecha_emision,fecha_vencimiento,impuesto_mora,estado,photo,cod_cliente,cod_clienteHijo)"+
                    "VALUES(?,?,?,?,?,?,?,?,?,?,?)");
            
 
            
            pstmt.setString(1, f.getNumero_Factura());
            pstmt.setDouble(2, f.getMonto_Total());
            pstmt.setDouble(3, f.getMonto_intereses());
            pstmt.setDouble(4, f.getSaldo());
            
            
            pstmt.setDate(5, new java.sql.Date(f.getFecha_vencimiento().getTime()));
            pstmt.setDate(6, new java.sql.Date(f.getFecha_emision().getTime()));
            pstmt.setDouble(7, f.getImpuesto_mora());
            pstmt.setString(8, f.getEstado());
            //
            
            //
            //12 para imagen
            if(f.getPhoto()!=null){
                FileInputStream fis=new FileInputStream(f.getPhoto());
                pstmt.setBinaryStream(9, fis, (int)f.getPhoto().length());
                
            }else{
                pstmt.setBinaryStream(9,null);
            }
            
            pstmt.setInt(10, cPadre);
            pstmt.setInt(11, cHijo);
            //Paso 4: Ejecutar la sentencia
            
            pstmt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(MySQLDAOFactura.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(MySQLDAOFactura.class.getName()).log(Level.SEVERE, null, ex);       
        } finally {
            try {//Paso 5: Cerramos la conexión
            conn.close(); } catch(Exception g) {g.printStackTrace();}
        }
    }

    @Override
    public void update(Factura f) {
       
        Connection conn = null;
        PreparedStatement pstmt = null;        
        //int result  = 0;
        try {
            //Paso 1: Registramos el driver
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //Paso 2: Obtenemos la conexión            
            conn = new DBConfig().getConnection();
            //Paso 3: Preparamos la sentencia  
            
            //insert into Cliente (`cod_cliente`, `razon_social`, `ruc`, `telefono`, `rubro`, `direccion1`,`direccion2`,`nombre_contacto`,`tlf_contacto`,`anexo_contacto`, `estado`,`cuenta`,`cod_usuario`) 
            pstmt = conn.prepareStatement(
                    "UPDATE factura SET "
                    + " monto_total = ?, monto_intereses=?, saldo=?,impuesto_mora=? ,estado = ?"
                    + " where numero_factura = ?");
            pstmt.setString(1, String.valueOf(f.getMonto_Total()));
            pstmt.setString(2,String.valueOf( f.getMonto_intereses()));
            pstmt.setString(3, String.valueOf(f.getSaldo()));
            pstmt.setString(4,String.valueOf(f.getImpuesto_mora()));
            pstmt.setString(5, f.getEstado());
            pstmt.setString(6, f.getNumero_Factura());
    
            pstmt.executeUpdate();
            
        } catch (SQLException ex) {
            Logger.getLogger(MySQLDAOCliente.class.getName()).log(Level.SEVERE, null, ex);
         } finally {
            try {//Paso 5: Cerramos la conexión
            conn.close(); } catch(Exception ex2) {ex2.printStackTrace();}
        }
    
    }

    @Override
    public void delete(String id) {
        //Pasos para la conexión a la BD
         Connection conn = null;
        PreparedStatement pstmt = null;
        //int result  = 0;
        try {
            //Paso 1: Registramos el driver
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //Paso 2: Obtenemos la conexión            
            conn = new DBConfig().getConnection();
            //Paso 3: Preparamos la sentencia              
            pstmt = conn.prepareStatement(
                    "UPDATE factura SET estado = ? where numero_factura = ?");
            pstmt.setString(1, "A");
            pstmt.setString(2,id);
           //Paso 4: Ejecutar la sentencia            
            pstmt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(MySQLDAOFactura.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {//Paso 5: Cerramos la conexión
            conn.close(); } catch(Exception f) {f.printStackTrace();}
        }
    }

    @Override
    public ArrayList<Factura> queryAll() {
        //Pasos para la conexión a la BD
        Connection conn = null;
        PreparedStatement pstmt = null;
        ArrayList<Factura> factList = new ArrayList<Factura>();        
        //int result  = 0;
        try {
            //Paso 1: Registramos el driver
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //Paso 2: Obtenemos la conexión            
            conn = new DBConfig().getConnection();
            //Paso 3: Preparamos la sentencia
            pstmt = conn.prepareStatement(
                    "SELECT * FROM factura");
            ResultSet rs = pstmt.executeQuery();
            while(rs.next()){
                Factura fact = new Factura();     
                fact.setNumero_Factura(rs.getString("numero_factura"));
                fact.setMonto_Total(rs.getDouble("monto_total"));
                fact.setMonto_intereses(rs.getDouble("monto_intereses"));
                fact.setSaldo(rs.getDouble("saldo"));
                fact.setFecha_emision(rs.getDate("fecha_emision"));
                fact.setFecha_vencimiento(rs.getDate("fecha_vencimiento"));
                fact.setImpuesto_mora(rs.getDouble("impuesto_mora"));
                fact.setEstado(rs.getString("estado"));                
                //para imagen
                File image = new File("java.jpg");

                FileOutputStream fos= new FileOutputStream(image);
                byte[] buffer = new byte[1];
                InputStream is = rs.getBinaryStream(9);
                if(is!=null){
                    while(is.read(buffer)>0 ){
                        fos.write(buffer);
                    }

                    fact.setPhoto(image);
                    is.close();
                }
                else {
                    fact.setPhoto(null);                
                }
                //
                fos.close();
                                            
                fact.setCod_Cliente(rs.getInt("cod_cliente"));                
                
                factList.add(fact);
            }
            
        //Paso 4: Ejecutar la sentencia
        } catch (SQLException ex) {
            Logger.getLogger(MySQLDAOFactura.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(MySQLDAOFactura.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(MySQLDAOFactura.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {//Paso 5: Cerramos la conexión
            conn.close(); } catch(Exception f) {f.printStackTrace();}
        }
        return factList;
    }

    @Override
    public Factura queryByid(String id) {
        //Pasos para la conexión a la BD
        Connection conn = null;
        PreparedStatement pstmt = null;        
        Factura fact = new Factura();     
        try {
            //Paso 1: Registramos el driver
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //Paso 2: Obtenemos la conexión            
            conn = new DBConfig().getConnection();
            //Paso 3: Preparamos la sentencia
            pstmt = conn.prepareStatement(
                    "SELECT * FROM factura where numero_factura= ?");
            pstmt.setString(1, id);
            ResultSet rs = pstmt.executeQuery();
            if(rs.first()){               
                fact.setNumero_Factura(rs.getString("numero_factura"));
                fact.setMonto_Total(rs.getDouble("monto_total"));
                fact.setMonto_intereses(rs.getDouble("monto_intereses"));
                fact.setSaldo(rs.getDouble("saldo"));
                fact.setFecha_emision(rs.getDate("fecha_emision"));
                fact.setFecha_vencimiento(rs.getDate("fecha_vencimiento"));
                fact.setImpuesto_mora(rs.getDouble("impuesto_mora"));
                fact.setEstado(rs.getString("estado"));                
                //para imagen
                File image = new File("java.jpg");

                FileOutputStream fos= new FileOutputStream(image);
                byte[] buffer = new byte[1];
                InputStream is = rs.getBinaryStream(9);
                if(is!=null){
                    while(is.read(buffer)>0 ){
                        fos.write(buffer);
                    }

                    fact.setPhoto(image);
                    is.close();
                }
                else {
                    fact.setPhoto(null);                
                }
                //
                fos.close();
                
                fact.setCod_Cliente(rs.getInt("cod_cliente"));
                
            }else{
                return null;
            }
        //Paso 4: Ejecutar la sentencia
        } catch (SQLException ex) {
            Logger.getLogger(MySQLDAOFactura.class.getName()).log(Level.SEVERE, null, ex);
         } catch (FileNotFoundException ex) {
            Logger.getLogger(MySQLDAOFactura.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(MySQLDAOFactura.class.getName()).log(Level.SEVERE, null, ex);       
        } finally {
            try {//Paso 5: Cerramos la conexión
            conn.close(); } catch(Exception f) {f.printStackTrace();}
        }   
        return fact;
    }

    @Override
    public void changeState(String id, String est) {
        //Pasos para la conexión a la BD
         Connection conn = null;
        PreparedStatement pstmt = null;
        //int result  = 0;
        try {
            //Paso 1: Registramos el driver
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //Paso 2: Obtenemos la conexión            
            conn = new DBConfig().getConnection();
            //Paso 3: Preparamos la sentencia              
            pstmt = conn.prepareStatement(
                    "UPDATE factura SET estado = ? where numero_factura = ?");
            pstmt.setString(1, est);
            pstmt.setString(2,id);
           //Paso 4: Ejecutar la sentencia            
            pstmt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(MySQLDAOFactura.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {//Paso 5: Cerramos la conexión
            conn.close(); } catch(Exception f) {f.printStackTrace();}
        }
    }


    @Override
    public ArrayList<Factura> queryFacturaByParameters(String numfactura, int codcliente, java.util.Date fechaemision1, java.util.Date fechaemision2, java.util.Date fechavencimiento1, java.util.Date fechavencimiento2, float monto1, float monto2) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs=null;
        ArrayList<Factura> listafacturas=new ArrayList<Factura>();
        
        try {
            //Paso 1: Registramos el driver
           DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            //Paso 2: Obtenemos la conexión            
            conn = new DBConfig().getConnection();
        SimpleDateFormat df = new SimpleDateFormat();
        df.applyPattern("dd/mm/yyyy");
        if(numfactura.equals("")) numfactura=null;
        String sql="select * from factura WHERE cod_cliente is not null";
        if(numfactura!=null)   {sql=sql+" AND numero_factura='"+numfactura+"'";}
        if(codcliente!=0) sql=sql+" AND cod_cliente="+codcliente+"";
        if(fechaemision1!=null) sql=sql+" AND fecha_emision>'"+df.format(fechaemision1) +"'";
        if(fechaemision2!=null) sql=sql+" AND fecha_emision<'"+df.format(fechaemision2) +"'";
                if(fechavencimiento1!=null) sql=sql+" AND fecha_vencimiento>'"+df.format(fechavencimiento1) +"'";
        if(fechavencimiento2!=null) sql=sql+" AND fecha_vencimiento<'"+df.format(fechavencimiento2) +"'";
        if(monto1!=0)   sql=sql+" AND monto_total>"+monto1;
        if(monto2!=0)   sql=sql+" AND monto_total<"+monto2;

        sql=sql+"   ORDER BY 1 ASC";
        
        System.out.println(sql);
        
        rs = conn.createStatement().executeQuery(sql);
        
        if (rs!=null)
            {
                
                while (rs.next())
                {
                    Factura fact=new Factura();
                     
                fact.setNumero_Factura(rs.getString("numero_factura"));
                fact.setMonto_Total(rs.getDouble("monto_total"));
                fact.setMonto_intereses(rs.getDouble("monto_intereses"));
                fact.setSaldo(rs.getDouble("saldo"));
                fact.setFecha_emision(rs.getDate("fecha_emision"));
                fact.setFecha_vencimiento(rs.getDate("fecha_vencimiento"));
                fact.setImpuesto_mora(rs.getDouble("impuesto_mora"));
                fact.setEstado(rs.getString("estado"));                
                //para imagen
                fact.setCod_Cliente(rs.getInt("cod_cliente"));

                
                listafacturas.add(fact);
                }
            }
        
         } catch (SQLException ex) {
            Logger.getLogger(MySQLDAOCliente.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally {
            try {//Paso 5: Cerramos la conexión
            conn.close(); } catch(Exception g) {g.printStackTrace();}
        }
        return listafacturas;

    }
    
}
